package win_service

import (
	"github.com/kardianos/service"
	"log/slog"
	"os"
	"ts-chao/src/common"
)

func ServerCmd() {
	winService, err := getWinService()
	if err != nil {
		slog.Error("error", err)
		return
	}

	if len(os.Args) > 1 {
		//以下日志不会打印，未知情况
		if os.Args[1] == "install" {
			err := winService.Install()
			if err != nil {
				slog.Error("error", "err", err)
				return
			}
			slog.Info("服务安装成功")
			err2 := winService.Start()
			if err2 != nil {
				slog.Info(err2.Error())
				return
			}
			slog.Info("服务启动成功")

			return
		}

		if os.Args[1] == "remove" {
			err := winService.Stop()
			if err != nil {
				slog.Error("error", "err", err)
				return
			}
			slog.Info("服务停止成功")

			err2 := winService.Uninstall()
			if err2 != nil {
				slog.Info(err2.Error())
				return
			}
			slog.Info("服务卸载成功")
			return
		}

		if os.Args[1] == "start" {
			err := winService.Start()
			if err != nil {
				slog.Error("error", "err", err)
			}
			slog.Info("服务启动成功")
			return
		}
		if os.Args[1] == "stop" {
			err := winService.Stop()
			if err != nil {
				slog.Error("error", "err", err)
			}
			slog.Info("服务停止成功")
			return
		}
		if os.Args[1] == "restart" {
			err := winService.Restart()
			if err != nil {
				slog.Error("error", "err", err)
			}
			slog.Info("服务重启成功")
			return
		}
	}

	if err = winService.Run(); err != nil {
		slog.Info("error", "err", err)
	}
}

func InstallServer() {
	winService, err := getWinService()
	if err != nil {
		slog.Error("error", "err", err)
		return
	}
	err = winService.Install()
	if err != nil {
		slog.Error("error", "err", err)
		return
	}
	err = winService.Start()
	if err != nil {
		slog.Error("error", "err", err)
		return
	}
}

func getWinService() (service.Service, error) {
	svcConfig := &service.Config{
		Name:        "TailScale",
		DisplayName: "TailScale Service",
		Description: "USB服务支持发现和关联USB设备。停止或禁用此服务可能会导致已安装的USB设备无法正常运行，并使新设备无法被发现或关联。",
		Executable:  common.GetEunPathAbc() + "/Tailscale/tailscaled.exe",
	}

	prg := &program{}
	winService, err := service.New(prg, svcConfig)
	return winService, err
}
